//
//  Calculate.swift
//  HeadlineNews
//
//  Created by han on 2019/7/19.
//  Copyright © 2019 han. All rights reserved.
//

import UIKit

// MARK: 主要用于画图Graphic
struct CalculatePixel {
    
    // 获取一个渲染像素对应的逻辑值
    static private var pixelSign = CGFloat(-1.0)
    static var pixel: CGFloat {
        if pixelSign < 0 {
            pixelSign = 1/UIScreen.main.scale
        }
        return pixelSign
    }
    
    // ceil 向上取整>=  round 四舍五入 floor 向下取整，去掉小数部分
    // 精确计算需要的像素数 >= 向上取整
    // 基于指定的倍数，对传进来的 floatValue 进行像素取整。若指定倍数为0，则表示以当前设备的屏幕倍数为准。
    // 2.1 -> 2X 2.5 ; 3X 2.333
    static func flatSpecificScale(_ value: CGFloat, scale: CGFloat = 0) -> CGFloat {
        let toScale = scale == 0 ? CommonSize.screenScale:scale
        let flatValue = ceil(value * toScale)/toScale
        return flatValue
    }
    
    // 类似flat()，只不过 flat 是向上取整，而 floorInPixel 是向下取整
    static func floorSpecificScale(_ value: CGFloat) -> CGFloat {
        let toScale = CommonSize.screenScale
        let flatValue = floor(value * toScale)/toScale
        return flatValue
    }
    
    
    
    /*
     1. 手机分辨率分为，逻辑分辨率，屏幕渲染分辨率，物理分辨率。
     5s: 320 x 568 - 2x -渲染 640 x 1136  -物理 同渲染分辨率
     8: 375 x 667 - 2x -渲染 750 x 1334  -物理 同渲染分辨率
     xs: 375 x 812 - 3x -渲染 1125 x 2436 -物理 同渲染分辨率
     xr: 414 x 896 - 2x -渲染 828 x 1792  -物理 同渲染分辨率
     8p: 414 x 736 - 3x -渲染 1242 x 2208 -物理 1080 X 1902
     xs max: 414 x 896 - 3x -渲染 1242 x 2688 -物理 同渲染分辨率
     
     Plus设备的物理分辨率和屏幕渲染分辨率不一样， X1.15倍。开发时按照渲染分辨率设计，系统会自动渲染成物理分辨率
     
     2. 放大模式。
     放大模式下逻辑分辨率和屏幕渲染分辨率会降低。
     let nativeScale = UIScreen.main.nativeScale // 物理分辨率/逻辑分辨率 (除)
     var scale = UIScreen.main.scale // 设备渲染分辨率/逻辑分辨率
     
     标准情况下 7：scale:2.0 nativeScale:2.0  ：375x667，750x1334
     放大模式下 7：scale:2.0 nativeScale:2.34375 ：放大模式后变为 320x568，640x1136 但是实际的物理分辨率仍旧 750x1334，所以nativeScale变为 1334/568
     
     3. 画图时为了精确计算像素值，需要将逻辑值转化为像素值，然后将像素值取整，再转化为逻辑值。因为像素值不会有半个
     
     */
    
}

// MARK: 常用计算函数
struct Calculate {
    // 计算精度 调整给定的某个 CGFloat 值的小数点精度，超过精度的部分按四舍五入处理。
    // 该方法无法解决浮点数精度运算的问题
    static func CGFloatFixed(_ value: CGFloat, _ precision: Int) -> CGFloat {
        let formatString = String.init(format: "%%.%df", precision)
        let toString = String.init(format: formatString, value)
        let toValue = Double(toString)
        return CGFloat(toValue ?? 0)
    }
    
    static func CGRectFixed(_ value: CGRect, _ precision: Int) -> CGRect {
        return CGRect(x: CGFloatFixed(value.origin.x, precision),
                      y: CGFloatFixed(value.origin.y, precision),
                      width: CGFloatFixed(value.size.width, precision),
                      height: CGFloatFixed(value.size.height, precision))
    }
    
    /// 角度数转化为弧度
    static func angle(by degree: Double) -> Double {
        return Double.pi * degree / 180
    }
    
    /// 弧度转化为角度
    static func degree(by angle: Double) -> Double {
        return angle/Double.pi * 180
    }
    
}

